import jieba


stopwords = {'将军', '却说', '丞相', '二人', '不可', '荆州', '不能', '如此', '商议', '如何', '主公', '军士',
             '左右', '军马', '引兵', '次日', '大喜', '天下', '东吴', '于是', '今日', '不敢', '魏兵', '陛下',
             '人马', '一人', '汉中', '不知', '，', '：', '。', '“', '”', '；'}
text_file = open(r"threekingdoms.txt", encoding='utf8').read()
seg_list = jieba.cut(text_file, cut_all=False)  # 用jieba库对文本进行中文分词，输出可能的分词的精确模式
a = []
for word in seg_list:
    if word not in stopwords:
        a.append(word)  # 通过循环迭代的方法，将过滤后的词语依次添加到刚刚建立的空数组当中。
# print(a)
counts = {}  # #新建一个空字典来存储文字和文字出现的次数
for word in a:
    if len(word) == 1:  # 挑出单个的分词（不计数）
        continue
    elif word == '诸葛亮' or word == "孔明曰":
        change_word = "孔明"
    elif word == "关公" or word == "云长":
        change_word = "关羽"
    elif word == "玄德" or word == "玄德曰":
        change_word = "刘备"
    elif word == "孟德":
        change_word = "曹操"
    else:
        change_word = word
    counts[change_word] = counts.get(change_word, 0) + 1  # 对word出现的频率进行统计，当word不在seg_list时，返回值是0，当word在seg_list中时，返回+1
    # ，以此进行累计计数
items = list(counts.items())  # 将字典类型转换为list类型便于操作
items.sort(key=lambda x: x[1], reverse=True)  # 根据items的第二个值进行从大到小的排序
# 默认是false，是从小到大，True的话就是从大到小，里面的'key='是list的sort排序的lambda方法
print("人物              出场次数")
print("-------------------------")
for i in range(10):  # 显示词频最高的前10个键值对
    word, count = items[i]  # 返回相对应的键值对
    print("{0:<10}{1:>10}".format(word, count))  # 左对齐，占位10位，填充字符为空格